package org.lanqiao.tjut.db;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import org.lanqiao.tjut.bean.DeptBean;
import org.lanqiao.tjut.bean.TBAdminsBean;

public class DBTestDriver {

	public static void main(String[] args) {
		test03();
	}

	/**
	 * 基于jdbc的事务处理
	 * 
	 */
	private static void test06() {
		/*
		 * jdbc是的事务处理的流程：
		 * 获取connection对象：
		 * 打开事务：
		 *    // 设置connection对象的事务自动提交的属性为false
		 *    connection.setAuotCommit(fasle);
		 * 事务处理：
		 *    进行多表的事务处理；（进行多表数据库操作时要求全部使用设置了事务的connection对象）
		 * 进行提交或回滚：
		 *   // 提交事务
		 *   conn.commit();
		 *   // 回滚事务
		 *   conn.rollback(); 
		 * 
		 */
		// 获取数据库连接对象
		Connection conn = null;
		try {
			// 获取数据库连接对象
			conn = DBSource.getDataSource().getConnection();
			// 打开事务：
			// 设置connection对象的事务自动提交的属性为false
			conn.setAutoCommit(false);
			// 开始多表的事务处理
			// 组织数据查询操作sql语句
			String strSql = "select count(*) adminCount from tbadmins where admins_name = ? and admins_psw = ?";
			// 查询语句的sql参数
			List<Object> lstParas = new ArrayList<>();
			BufferedReader br = new BufferedReader(new InputStreamReader(System.in, "UTF-8"));
			System.out.println("请输入登录用户名：");
			String strUserName = br.readLine();
			// 添加参数
			lstParas.add(strUserName);
			System.out.println("请输入登录秘密：");
			String strUserPsw = br.readLine();
			lstParas.add(strUserPsw);
			// 调用db层执行sql语句
			Object objVal = DBFactory.getDBDriverInstance().query(conn, strSql, new ScalarHandler(),
					lstParas.toArray());
			// System.out.println("objVal:"+objVal);
			int i = Integer.parseInt(objVal.toString());
			// 判定是否登录成功
			if (i > 0) {
				System.out.println("登录成功：" + strUserName);
			} else {
				System.out.println("登录失败，请检查用户名密码是否正确");
			}
			// 事务处理1：修改admin的密码
			String strSqlModify = "update tbadmins set admins_psw = ?";
			System.out.println("请输入修改的新密码：");
			String strNewUserPsw = br.readLine();
			int iupate = DBFactory.getDBDriverInstance().update(conn, strSqlModify, strNewUserPsw);
			// 验证当前操作已经完成
			// 组织数据查询操作sql语句
			String strSqlQuery = "select * from tbadmins where admins_name = 'admin'";
			TBAdminsBean tbAdminsB = DBFactory.getDBDriverInstance().query(conn, strSqlQuery, new BeanHandler<>(TBAdminsBean.class));
			System.out.println("update操作之后，当前数据库中的记录内容："+tbAdminsB.toString());
			// 事务处理2：添加一条新的数据记录
			String strSql2 = "INSERT INTO TBADMINS(ADMINS_NAME,ADMINS_PSW) VALUES ('admin2', 'admin2')";
			int iInsert = DBFactory.getDBDriverInstance().update(conn, strSql2);
			// 根据业务逻辑判定事务处理是提交还是回滚
			// 事务提交或回滚处理
			if (iupate > 0 && iInsert > 0) {
				// 提交事务
				conn.commit();
			} else {
				// 回滚事务
				conn.rollback();
			}
		} catch (SQLException e) {
			// 发生异常，进行事务回滚
			// 回滚事务
			try {
				conn.rollback();
			} catch (SQLException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("-------------------");

	}

	/**
	 * 登录的实现1
	 * 
	 * @throws Exception
	 */
	private static void test05_2() throws Exception {
		// 组织数据查询操作sql语句
		String strSql = "select count(*) adminCount from tbadmins where admins_name = ? and admins_psw = ?";
		// 查询语句的sql参数
		List<Object> lstParas = new ArrayList<>();
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in, "UTF-8"));
		System.out.println("请输入登录用户名：");
		String strUserName = br.readLine();
		// 添加参数
		lstParas.add(strUserName);
		System.out.println("请输入登录秘密：");
		String strUserPsw = br.readLine();
		lstParas.add(strUserPsw);
		// 调用db层执行sql语句
		Object objVal = DBFactory.getDBDriverInstance().query(strSql, new ScalarHandler(), lstParas.toArray());
		// System.out.println("objVal:"+objVal);

		int i = Integer.parseInt(objVal.toString());
		// 判定是否登录成功
		if (i > 0) {
			System.out.println("登录成功：" + strUserName);
		} else {
			System.out.println("登录失败，请检查用户名密码是否正确");
		}
		System.out.println("-------------------");

	}

	/**
	 * 登录的实现1
	 * 
	 * @throws Exception
	 */
	private static void test05() throws Exception {
		// 组织数据查询操作sql语句
		String strSql = "select * from tbadmins where admins_name = ? and admins_psw = ?";
		// 查询语句的sql参数
		List<Object> lstParas = new ArrayList<>();
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in, "UTF-8"));
		System.out.println("请输入登录用户名：");
		String strUserName = br.readLine();
		// 添加参数
		lstParas.add(strUserName);
		System.out.println("请输入登录秘密：");
		String strUserPsw = br.readLine();
		lstParas.add(strUserPsw);
		// 调用db层执行sql语句
		List<TBAdminsBean> lstAdmins = DBFactory.getDBDriverInstance().query(strSql,
				new BeanListHandler<>(TBAdminsBean.class), lstParas.toArray());

		// 判定是否登录成功
		if (lstAdmins != null && lstAdmins.size() > 0) {
			System.out.println("登录成功：" + strUserName);
		} else {
			System.out.println("登录失败，请检查用户名密码是否正确");
		}

		System.out.println("-------------------");

	}

	/**
	 * 新增操作
	 */
	private static void test04() {
		// 组织数据查询操作sql语句
		String strSql = "INSERT INTO dept(department_id, department_name, manager_id, location_id) "
				+ " VALUES (?,?, ?, ?)";
		// 数据库操作sql语句的参数
		List<Object> lstParas = new ArrayList<>();
		// 添加参数
		lstParas.add(910);
		lstParas.add("Test910");
		lstParas.add(210);
		lstParas.add(7100);
		int i = DBFactory.getDBDriverInstance().update(strSql, lstParas.toArray());

		// 根据数据操作结果进行业务逻辑处理
		if (i > 0) {
			System.out.println("数据添加成功");
		}

		System.out.println("-------------------");

	}

	private static void test03() {
		// 组织数据查询操作sql语句
		String strSql = "select * from dept where department_id > ?";
		// 数据库操作sql语句的参数
		Object[] params = { 60 };
		List<DeptBean> lstDepts = DBFactory.getDBDriverInstance().query(strSql, new BeanListHandler<>(DeptBean.class),
				params);

		// 根据数据操作结果进行业务逻辑处理
		for (DeptBean deptB : lstDepts) {
			// 使用迭代器遍历实体bean对象
			System.out.println(deptB);
		}

		System.out.println("-------------------");
		System.out.println(lstDepts.get(0).getDepartment_name());

	}

	private static void test02() {
		// 4、组织数据操作sql语句
		String strSql = "select * from dept";
		List<DeptBean> lstDepts = DBFactory.getDBDriverInstance().query(strSql, new BeanListHandler<>(DeptBean.class));

		// 6、根据数据操作结果进行业务逻辑处理
		for (DeptBean deptB : lstDepts) {
			// 使用迭代器遍历实体bean对象
			System.out.println(deptB);
		}
		System.out.println("-------------------");
		System.out.println(lstDepts.get(0).getDepartment_name());

	}
}
